#include<bits/stdc++.h>
using namespace std;
int T,n,m,l,v,p[100005],ans,pos,ls,sum;
struct node{
    int d,v,a;
}t[100005];
struct node2{
    int op,p,t;
    bool operator<(const node2 s){
        if(p==s.p)
            return op<s.op;
        return p<s.p;
    }
}d[200005];
int get(int x){
    int l=1,r=m,ans=0;
    while(l<=r){
        int mid=l+r>>1;
        if(p[mid]>=x)
            ans=mid,r=mid-1;
        else
            l=mid+1;
    }
    return ans;
}
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    scanf("%d",&T);
    while(T--){
        ans=0,pos=0,ls=0,sum=0;
        scanf("%d%d%d%d",&n,&m,&l,&v);
        for(int i=1;i<=n;i++)
            scanf("%d%d%d",&t[i].d,&t[i].v,&t[i].a);
        for(int i=1;i<=m;i++)
            scanf("%d",p+i);
        sort(p+1,p+m+1);
        for(int i=1;i<=n;i++){
            if(t[i].a==0){
                if(t[i].v>v){
                    int idx=get(t[i].d);
                    if(idx)
                        ans++,d[++pos]={0,idx,m},d[++pos]={1,m,idx};//,cout<<i<<endl;
                }
            }else if(t[i].a>0){
                if(t[i].v>v){
                    int idx=get(t[i].d);
                    if(idx)
                        ans++,d[++pos]={0,idx,m},d[++pos]={1,m,idx};//,cout<<i<<endl;
                    continue;
                }else{
                    int tmp;
                    if((v*v-t[i].v*t[i].v)%(2*t[i].a)==0){
                        int dt=(v*v-t[i].v*t[i].v)/(2*t[i].a)+t[i].d;
                        if(dt>l)
                            continue;
                        tmp=dt+1;
                    }else{
                        double dt=1.0*(v*v-t[i].v*t[i].v)/(2.0*t[i].a);
                        dt+=t[i].d;
                        if(dt>l)
                            continue;
                        tmp=ceil(dt);
                    }
                    int idx=get(tmp);
                    if(idx)
                        ans++,d[++pos]={0,idx,m},d[++pos]={1,m,idx};//,cout<<i<<endl;
                }
            }else{
                if(t[i].v>v){
                    int tmp;
                    if((-v*v+t[i].v*t[i].v)%(-2*t[i].a)==0){
                        int dt=(-v*v+t[i].v*t[i].v)/(-2*t[i].a)+t[i].d;
                        if(dt>p[m]){
                            int idx=get(t[i].d);
                            if(idx)
                                ans++,d[++pos]={0,idx,m},d[++pos]={1,m,idx};//,cout<<i<<endl;
                        }
                        tmp=dt-1;
                    }else{
                        double dt=1.0*(v*v-t[i].v*t[i].v)/(2.0*t[i].a);
                        dt+=t[i].d;
                        if(dt>p[m]){
                            int idx=get(t[i].d);
                            if(idx)
                                ans++,d[++pos]={0,idx,m},d[++pos]={1,m,idx};//,cout<<i<<endl;
                            continue;
                        }
                        tmp=floor(dt);
                    }
                    int idx=get(tmp),idx2=get(t[i].d);
                    if(p[idx]>tmp)
                        idx--;
                    if(idx&&idx2&&idx2<=idx)
                        ans++,d[++pos]={0,idx2,idx},d[++pos]={1,idx,idx2};//,cout<<i<<endl;
                }
            }
        }
        sort(d+1,d+pos+1);
        for(int i=1;i<=pos;i++){
            if(d[i].op==1){
                if(ls<d[i].t)
                    ls=d[i].p,sum++;
            }
        }
        printf("%d %d\n",ans,m-sum);
    }
    return 0;
}
